package controls

import (
	"github.com/labstack/echo/v4"
	"github.com/rs/xid"
	"io"
	"os"
	"sofuny/models"
	"sofuny/utils"
	"strings"
)

// 文章配图上传
func UploadArticleImage(ctx echo.Context) error {
	// 获取上传文件名
	file, err := ctx.FormFile("article-image")
	if err != nil {
		return ctx.JSON(200, utils.Response{
			Code: 201,
			Msg:  "获取数据失败",
			Data: err.Error(),
			Time: utils.FormatTime(),
		})
	}
	fileRead, err := file.Open()
	if err != nil {
		return ctx.JSON(200, utils.Response{
			Code: 201,
			Msg:  "打开文件失败",
			Data: err.Error(),
			Time: utils.FormatTime(),
		})
	}
	defer fileRead.Close()
	// 根据uuid 生成图片名称
	fileNames := strings.Split(file.Filename, ".")
	imgName := xid.New().String() + "." + fileNames[len(fileNames)-1]
	// 创建 文件 路径
	dist, err := os.Create("./static/image/article/" + imgName)
	if err != nil {
		return ctx.JSON(200, utils.Response{
			Code: 201,
			Msg:  "创建文件路径失败",
			Data: err.Error(),
			Time: utils.FormatTime(),
		})
	}
	defer dist.Close()
	// 复制 内容到文件
	if _, err = io.Copy(dist, fileRead); err != nil {
		return ctx.JSON(200, utils.Response{
			Code: 201,
			Msg:  "复制打开文件的内容失败",
			Data: err.Error(),
			Time: utils.FormatTime(),
		})
	}
	// 上传成功 返回图片链接地址
	return ctx.JSON(200, utils.Response{
		Code: 200,
		Msg:  "success",
		Data: app.StaticApi + "/static/image/article/" + imgName,
		Time: utils.FormatTime(),
	})
}

// 删除图片
type Image struct {
	Name string `json:"name"`
}

func RemoveArticleImage(ctx echo.Context) error {
	var img Image
	if err := ctx.Bind(&img); err != nil {
		return ctx.JSON(200, utils.Response{
			Code: 201,
			Msg:  "获取绑定数据失败",
			Data: err.Error(),
			Time: utils.FormatTime(),
		})
	} else {
		// 获取要移除的文件名 必须包含要移除图片名
		fileNames := strings.Split(img.Name, "/")
		// 获取当前路径
		pwdPath, err := os.Getwd()
		if err != nil {
			return ctx.JSON(200, utils.Response{
				Code: 201,
				Msg:  "获取当前路径失败",
				Data: err.Error(),
				Time: utils.FormatTime(),
			})
		}
		// 执行移除图片
		err = os.Remove(pwdPath + "/static/image/article/" + fileNames[len(fileNames)-1])

		if err != nil {
			return ctx.JSON(200, utils.Response{
				Code: 201,
				Msg:  "移除图片失败",
				Data: err.Error(),
				Time: utils.FormatTime(),
			})
		}
		return ctx.JSON(200, utils.Response{
			Code: 200,
			Msg:  "移除图片成功",
			Data: nil,
			Time: utils.FormatTime(),
		})
	}
}

// 所有文章
func FindAllArticles(ctx echo.Context) error {
	var articles []models.Article
	// 查找
	if err := db.Where("status=?", true).
		Order("create_at desc").
		Find(&articles).Error; err != nil {
		return ctx.JSON(200, utils.Response{
			Code:  201,
			Msg:   "获取文章失败",
			Data:  err,
			Total: 1,
			Time:  utils.FormatTime(),
		})
	}
	// 成功
	return ctx.JSON(200, utils.Response{
		Code:  200,
		Msg:   "success",
		Data:  articles,
		Total: len(articles),
		Time:  utils.FormatTime(),
	})
}

// 获取单个文章
func FindArticle(ctx echo.Context) error {
	var article models.Article
	uuid := ctx.QueryParam("uuid")
	// 判断数据
	if uuid == "" {
		return ctx.JSON(200, utils.Response{
			Code:  201,
			Msg:   utils.DataEmptyMessage,
			Data:  nil,
			Total: 1,
			Time:  utils.FormatTime(),
		})
	}
	// 查找文章
	if err := db.Where("status=? and uuid=?", true, uuid).First(&article).Error; err != nil {
		return ctx.JSON(200, utils.Response{
			Code:  201,
			Msg:   "获取文章失败",
			Data:  err,
			Total: 1,
			Time:  utils.FormatTime(),
		})
	}
	// 根据给定的条件更新单个属性
	db.Model(&article).
		Where("status=? and uuid=?", true, uuid).
		Update("view_counts", article.ViewCounts+1)

	// 返回数据
	return ctx.JSON(200, utils.Response{
		Code:  200,
		Msg:   "success",
		Data:  article,
		Total: 1,
		Time:  utils.FormatTime(),
	})
}
